package Timer;

import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * Created with IntelliJ IDEA.
 * Description: 自己实现一个计时器
 * User:周次煜
 * Date: 2024-07-26
 * Time：22:11
 */
public class MyTimerTask implements Comparable<MyTimerTask> {

//    时间延时
    private long time;

//    需要运行的任务
     private Runnable runnable;



//     初始化任务和时间
     public MyTimerTask(Runnable runnable , long time) {
         this.runnable =  runnable;
         this.time = time + System.currentTimeMillis();

     }


     // 执行这个任务
    public void setRunnable() {
         runnable.run();
    }

    // 得到时间
    public long getTime() {
        return    time;
    }


    // 声明比较对象
    @Override
    public int compareTo(MyTimerTask o) {
        return (int)(this.time-o.time);
    }

}


class MyTimer {

    // 用队列来管理时间的快慢程度
  private  PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();

    // 创建锁对象
   private  Object locker = new Object();







    public MyTimer() {
        // 创建一个线程来进行任务的判断
        Thread thread = new Thread(()->{


                try {
                    // 死循环进行
                    while(true) {
                        synchronized(locker) {
                            // 判断队列是否为 空
                            // 保证队列即为空，也同时是 notify 唤醒的
                            while (queue.isEmpty()) {
                                locker.wait();
                            }

                            MyTimerTask myTimerTask = queue.peek();


                            // 一旦现在时间超过时间就开始执行
                            if (myTimerTask.getTime() <= System.currentTimeMillis()) {

                                myTimerTask.setRunnable();
//                        执行完就出队列
                                queue.poll();
                            } else {
//                          一旦没到时间就进行等待
                                locker.wait(myTimerTask.getTime() - System.currentTimeMillis());
                            }

                        }

                    }

                } catch (InterruptedException e) {
                    throw new RuntimeException(e);

                }


        });

        thread.start();
    }



    // 进行调用
    public  void  schedule(Runnable runnable, long delay) {

        synchronized(locker) {


            // 任务执行类
            MyTimerTask myTimerTask = new MyTimerTask(runnable,delay);

            // 添加进队列
            queue.add(myTimerTask);



            // 每入队列一次就唤醒一次
            locker.notify();

        }


    }

}


class MyTimerTest{
    public static void main(String[] args) {

        // 创建一个自己的
        MyTimer myTimer = new MyTimer();

        myTimer.schedule(()->{
            System.out.println("第五快");
        },5000);


        myTimer.schedule(()->{
            System.out.println("第四快");
        },4000);


        myTimer.schedule(()->{
            System.out.println("第三快");
        },3000);


        myTimer.schedule(()->{
            System.out.println("第二快");
        },2000);

        myTimer.schedule(()->{
            System.out.println("第一快");
        },1000);

    }
}


